home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mint110s / cpu.spp < prev    next >
Text File  |  1993-08-16  |  3KB  |  129 lines

  1. ;
  2. ; CPU tricks (mostly having to do with the MMU)
  3. ;
  4. ;
  5. ; set_mmu(crp,tc): called once, the first time a page table is built, to 
  6. ; switch away from the MMU setup that came from the ROM and into the setup 
  7. ; that we just built.  The CRP is actually on the stack, and it's 8 bytes.
  8. ; The TC is four bytes at sp@(0xc).  "Nulls" is here because we need to
  9. ; shove zeros into a few places.
  10. ;
  11.     DATA
  12. nulltc:    dc.l    0
  13.  
  14.     TEXT
  15.     XDEF    _set_mmu
  16. _set_mmu:
  17.     pmove    (nulltc).l,tc        ; turn off mmu
  18.     dc.l    $f0390800,nulltc    ; pmove nulltc,tt0
  19.     dc.l    $f0390c00,nulltc    ; pmove nulltc,tt1
  20.     pmove    4(sp),crp        ; caution: crp is 8 bytes
  21.     pmove    $c(sp),tc
  22.     rts
  23. ;
  24. ; save_mmu, restr_mmu: save and restore the MMU setup that came from ROM
  25. ;
  26.     DATA
  27. oldcrp:    dc.l    0
  28.     dc.l    0
  29. oldtc:    dc.l    0
  30. oldtt0:    dc.l    0
  31. oldtt1:    dc.l    0
  32.  
  33.     TEXT
  34.     XDEF    _save_mmu
  35. _save_mmu:
  36.     pmove    tc,oldtc
  37.     dc.l    $f0390a00,oldtt0    ; pmove    tt0,oldtt0
  38.     dc.l    $f0390e00,oldtt1    ; pmove    tt1,oldtt1
  39.     pmove    crp,oldcrp
  40.     rts
  41.  
  42.     XDEF    _restr_mmu
  43. _restr_mmu:
  44.     pmove    (nulltc).l,tc
  45.     dc.l    $f0390800,oldtt0    ; pmove    oldtt0,tt0
  46.     dc.l    $f0390c00,oldtt1    ; pmove    oldtt1,tt1
  47.     pmove    oldcrp,crp
  48.     pmove    oldtc,tc
  49.     rts
  50. ;
  51. ; Cache tricks
  52. ;
  53.     XDEF    _cpush
  54.     XREF    _mcpu        ; in main.c
  55. ;
  56. ; cpush(void *base, long length):
  57. ; flush both caches from base over a distance of length. If length is -1
  58. ; then the entire cache is flushed
  59. ;
  60. _cpush:
  61.     movem.l    4(a7),d0/a0    ; get parameters
  62.     exg    a0,d0        ; and in the right order
  63.     move.l    _mcpu,d1    ; start checking the CPU type
  64.     cmp.l    #20,d1
  65.     bcs.s    noc
  66.     cmp.l    #40,d1
  67.     bne.s    is030
  68.     
  69.     addq.l    #1,d0        ; if was -1
  70.     beq.s    abc040        ; then flush everything
  71.     add.l    #14,d0        ; round up to line boundary
  72.     lsr.l    #4,d0        ; convert to number of lines
  73.     cmp.l    #256,d0
  74.     bcs.s    fls040        ; not too many lines, so dump only some
  75.  
  76. abc040:    dc.w    $F4F8        ; this is "cpusha bc" if your asm knows '040
  77.     bra.s    noc
  78.     
  79. ; run through d0+1 times (since a0 may not be on a line boundary)
  80. fls040:    moveq    #16,d1
  81. do040:    dc.w    $F4E8        ; this is "cpushl bc,(a0)" for the '040
  82.     add.w    d1,a0
  83.     dbf    d0,do040
  84.     bra.s    noc
  85.  
  86. is030:
  87.     movec    cacr,d1
  88.     move.l    d1,-(a7)
  89.     addq.l    #1,d0        ; if was -1
  90.     beq.s    abc030        ; then flush everything
  91.     addq.l    #2,d0        ; round up to long boundary
  92.     lsr.l    #2,d0        ; convert to number of longs
  93.     cmp.l    #64,d0
  94.     bcs.s    fls030        ; dump selectively
  95.     
  96. abc030:    or.w    #$808,d1
  97.     movec    d1,cacr
  98.     bra.s    rescacr
  99.  
  100. fls030:    or.w    #$404,d1    ; clear DC/IC entries
  101. ; run through d0+1 times (since a0 may not be on a long boundary)
  102. do030:    movec    a0,caar
  103.     movec    d1,cacr
  104.     addq.w    #4,a0
  105.     dbf    d0,do030
  106. rescacr:
  107.     move.l    (a7)+,d0
  108.     movec    d0,cacr
  109. noc:    rts
  110.  
  111. ;
  112. ; Set the stack pointer to a new value
  113. ; Called when we're starting GEM from the exec_os vector
  114.  
  115.     XDEF    _setstack
  116. _setstack:
  117.     move.l    (sp)+,a0    ; pop return address
  118.     move.l    (sp)+,sp    ; set stack pointer
  119.     jmp    (a0)        ; return
  120.  
  121. ;
  122. ; PMMU stuff
  123. ;
  124.     XDEF    _flush_pmmu
  125. _flush_pmmu:
  126.     pflusha
  127.     rts
  128.     END
  129.